/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.vse.adventura.po1715.xburj54_bursa.gui;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_txt.IGame;
import cz.pecinovsky.english.pojj.adv_framework.test_util.default_game.hra.DefaultGame;
import cz.vse.adventura.po1715.xburj54_bursa.hra.HraLupič;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuItem;



/*******************************************************************************
 * Instance třídy {@code MenuGame} představují nabídku obsahující
 * příkazy přímo ovládající hraní hry a jeho parametry.
 *
 * @author    Jan Bursa
 * @version   1.01
 */
@SuppressWarnings("serial")
class MenuGame extends JMenu
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** GUI, pro které tato instance pracuje. */
    private final GUI_04 gui;

//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     */
    public MenuGame(GUI_04 gui)
    {
        super("Hra");
        setMnemonic('H');
        this.gui = gui;

        addItemShowMap();
        addSubmenuNewGame();
        addItemRestartGame();
        addItemQuitGame();
        addItemExitGUI();

    }


//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Přidá položku nabídky Restart hry.
     */
    private void addItemRestartGame() {
        JMenuItem item = new JMenuItem("Restart hry", 'R');
        this.add(item);

        item.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e) {
                IGameG game = stopGame();
                gui.startGame(game);
            }
        });

    }

    /***************************************************************************
     * Přidá položku nabídky Konec aplikace.
     */
    private void addItemExitGUI() {
        JMenuItem item = new JMenuItem("Konec aplikace", 'K');
        this.add(item);

        item.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e) {
                IGameG game = stopGame();
                System.exit(0);
            }
        }
        );
    }

    /***************************************************************************
     * Přidá podmenu, které nabídne dostupné hry.
     *
     */

    private void addSubmenuNewGame() {
        JMenu menuNewGame = new JMenu("Nová hra");
        menuNewGame.setMnemonic('N');

        menuNewGame.add(addGameItem("Default", DefaultGame.getInstance()));
        menuNewGame.add(addGameItem("Lupič", HraLupič.getHra()));

        this.add(menuNewGame);
    }

    /***************************************************************************
     * Přidá položku s hrou, kterou uživatel může vybrat a spustit
     *
     * @param String name - název položky
     * @param IGameG game - hra, která se má spustit
     */
    private JMenuItem addGameItem(String name, IGameG game) {
        JMenuItem newGameItem = new JMenuItem(name);
        final IGameG newGame = game;
        newGameItem.addActionListener( new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                IGameG oldGame = stopGame();
                gui.startGame(newGame);
            }
        }
        );
        return newGameItem;
    }

    /***************************************************************************
     * Přidá položku nabídky Ukončit hru.
     *
     */
    private void addItemQuitGame() {
        JMenuItem item = new JMenuItem("Ukončit hru", 'U');
        this.add(item);

        item.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e) {
                IGame game = stopGame();
            }
        }
        );
    }

    /***************************************************************************
     * Nastaví zobrazování plánku hry.
     */
    private void addItemShowMap()
    {
        final JCheckBoxMenuItem showMap = new JCheckBoxMenuItem(
                                              "Zobrazovat plánek hry", gui.isMapVisible());
        showMap.setMnemonic('P');
        this.add(showMap);

        showMap.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e)
            {
                gui.setMapVisible(showMap.getState());
            }
        });
    }

    /***************************************************************************
     * Ukončí právě hranou hru.
     */
    private IGameG stopGame() {
        IGameG game = gui.getGame();
        if ((game != null) && (!game.isReady())) {
            game.stop();
        }
        return game;
    }
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        MenuGame inst = new MenuGame();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
